// 版权归Go作者所有。版权所有。
// 此源代码的使用受BSD样式
// 许可证的约束，该许可证可以在许可证文件中找到。

package net

import "os"

// 错误（mikio）：在JS和Windows上，没有实现FileConn、FileListener和
// FilePacketConn函数。

type fileAddr string

func (fileAddr) Network() string  { return "file+net" }
func (f fileAddr) String() string { return string(f) }

// FileConn返回与打开的文件f对应的网络连接的副本。
// 完成后，呼叫方有责任关闭f。
// 关闭c不影响f，关闭f不影响c。
func FileConn(f *os.File) (c Conn, err error) {
	c, err = fileConn(f)
	if err != nil {
		err = &OpError{Op: "file", Net: "file+net", Source: nil, Addr: fileAddr(f.Name()), Err: err}
	}
	return
}

// FileListener将对应于
// 的网络侦听器的副本返回到打开的文件f中。
// 完成后，呼叫方有责任关闭ln。
// 结束ln不影响f，结束f不影响ln。
func FileListener(f *os.File) (ln Listener, err error) {
	ln, err = fileListener(f)
	if err != nil {
		err = &OpError{Op: "file", Net: "file+net", Source: nil, Addr: fileAddr(f.Name()), Err: err}
	}
	return
}

// FilePacketConn返回与打开的文件f对应的数据包网络连接的副本
// 。
// 完成后，呼叫方有责任关闭f。
// 关闭c不影响f，关闭f不影响c。
func FilePacketConn(f *os.File) (c PacketConn, err error) {
	c, err = filePacketConn(f)
	if err != nil {
		err = &OpError{Op: "file", Net: "file+net", Source: nil, Addr: fileAddr(f.Name()), Err: err}
	}
	return
}
